场景介绍
BLE外围设备作为服务端,可以接收来自中心设备(客户端)的GATT连接请求,应答来自中心设备的特征值内容读取和写入请求,并向中心设备提供数据,从而实现信息交互和消息同步。同时外围设备还可以主动向中心设备发送数据。
接口说明
低功耗蓝牙外围设备操作类BlePeripheralManager的接口说明如下。
接口名 |
功能描述 |
---|---|
BlePeripheralManager(Context context, BlePeripheralManagerCallback callback, int transport) |
获取外围设备管理回调对象。 |
getServices() |
获取外围设备的所有服务。 |
addService(GattService service) |
将GATT服务加入服务端。 |
cancelConnection(BlePeripheralDevice device) |
取消与中心设备的GATT连接。 |
clearServices() |
删除所有的GATT服务。 |
close() |
关闭GATT服务端。 |
getDevicesByStates(int[] states) |
通过状态获取连接的中心设备列表。 |
notifyCharacteristicChanged(BlePeripheralDevice device, GattCharacteristic characteristic, boolean confirm) |
通知中心设备特征值出现变化。 |
removeGattService(GattService service) |
移除特定的服务。 |
sendResponse(BlePeripheralDevice device, int requestId, int status, int offset, byte[] value) |
发送回复给中心设备。 |
低功耗蓝牙外围设备管理回调类BlePeripheralManagerCallback的接口说明如下。
接口名 |
功能描述 |
---|---|
receiveCharacteristicReadEvent(BlePeripheralDevice device, int requestId, int offset, GattCharacteristic characteristic) |
收到中心设备对特征值的读取请求回调。 |
receiveCharacteristicWriteEvent(BlePeripheralDevice device, int requestId, GattCharacteristic characteristic, boolean isPrep, boolean needRsp, int offset, byte[] value) |
收到中心设备对特征值的写入请求。 |
connectionStateChangeEvent(BlePeripheralDevice device, int interval, int latency, int timeout, int status) |
中心设备连接事件回调。 |
receiveDescriptorReadEvent(BlePeripheralDevice device, int transId, int offset, GattDescriptor descriptor) |
收到中心设备对描述值的读取请求回调。 |
receiveDescriptorWriteRequestEvent(BlePeripheralDevice device, int transId, GattDescriptor descriptor, boolean isPrep, boolean needRsp, int offset, byte[] value) |
收到中心设备对描述值的写入请求回调。 |
executeWriteEvent(BlePeripheralDevice device, int requestId, boolean execute) |
向中心设备执行写入操作的回调。 |
mtuUpdateEvent(BlePeripheralDevice device, int mtu) |
中心设备MTU值变化的回调。 |
notificationSentEvent(BlePeripheralDevice device, int status) |
向中心设备发送通知的回调。 |
serviceAddedEvent(int status, GattService service) |
向外围设备添加服务结果回调。 |
开发步骤
- 调用BlePeripheralManager(Context context, BlePeripheralManagerCallback callback, int transport)接口创建外围设备服务端并开启服务。
- 调用GattService(UUID uuid, boolean isPrimary)接口创建服务对象,向外围设备添加服务。
从回调接口onCharacteristicWriteRequest中获取中心设备发送来的消息,调用notifyCharacteristicChanged接口向中心设备发送通知。
private BlePeripheralDevice blePeripheralDevice;
private MyBlePeripheralManagerCallback peripheralManagerCallback = new MyBlePeripheralManagerCallback();
// 创建外围设备服务端并开启服务
private BlePeripheralManager peripheralManager = new BlePeripheralManager(this, peripheralManagerCallback, 0);
// 创建服务对象,向外围设备添加服务
private GattService service = new GattService(UUID.fromString(Service_UUID), true);
private GattCharacteristic writeCharacteristic = new GattCharacteristic(Character_UUID,
GattCharacteristic.PROPERTY_WRITE, GattCharacteristic.PROPERTY_WRITE);
service.addCharacteristic(writeCharacteristic);
peripheralManager.addServerService(service);
// 向中心设备发送通知
writeCharacteristic.setValue(data);
peripheralManager.notifyCharacteristicChanged(blePeripheralDevice, writeCharacteristic, false);
// 外围设备管理回调
public class MyBlePeripheralManagerCallback extends BlePeripheralManagerCallback {
// 中心设备向外围设备写入数据回调
public void receiveCharacteristicWriteEvent(BlePeripheralDevice device, int requestId,
GattCharacteristic characteristic, boolean isPrep, boolean needRsp, int offset, byte[] value){
// 中心设备写入外围设备的数据为value,对数据进行处理
}
// 外围设备连接状态变化回调
public void connectionStateChangeEvent(BlePeripheralDevice device, int interval, int latency, int timeout, int status){
if (status == ProfileBase.STATE_CONNECTED) {
// 中心设备连接服务端成功
blePeripheralDevice = device;
}
}
// 向中心设备发送通知回调
public void notificationSentEvent(BlePeripheralDevice device, int status){
if (status == BlePeripheralDevice.OPERATION_SUCC) {
// 向对中心设备发送通知成功回调
}
}
}